#include <myhead.h>
#include "../common/userinfo.h"
#include "../common/mynet.h"

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;      
typedef struct sockaddr_un addr_un_t;

void handle(link_t* L,msg_send_t* msg, msg_ret_t* ret){
	msg_ret_init(ret);
	switch(msg->cmd){
	case 1:{
		//login
		//node_t* p=link_findByUsername(L, msg->username);
		node_t *p=link_findByUsername(L, msg->username);
		if(p == NULL){//用户不存在
			printf("111\n");
			ret->ret=2;
			strcpy(ret->errmsg,"该用户不存在");
			return;
		}
		printf("222\n");
		//用户存在，校验用户密码
		if(strcmp(p->data.passwd, msg->passwd)==0){
			ret->ret=1;
			strcpy(ret->errmsg,"登录成功");
			return;
		}
		ret->ret=2;
		strcpy(ret->errmsg,"密码错误");
		return;
	}
	case 2:{//reg
		//查询用户是否已经存在
		node_t *p=link_findByUsername(L, msg->username);
		if(p!=NULL){
			ret->ret=2;
			strcpy(ret->errmsg,"注册失败，该用户已经存在");
			return;
		}

		//若不存在，将用户添加到文件中
		userinfo_t uuu;
		strcpy(uuu.username, msg->username);
		strcpy(uuu.passwd,msg->passwd);
		file_appendUser(uuu);

		//将用户信息，追加到内存中
		link_insertHead(L, uuu);
		ret->ret=1;
		strcpy(ret->errmsg,"注册成功");
		break;
		}
	default://不支持的操作
		ret->ret=2;
		strcpy(ret->errmsg,"不支持的操作，目前仅支持1-登录，2-注册操作");
		break;
	}
}


int main(int argc, const char *argv[])
{
	//入参校验
	if(argc != 3){
		fprintf(stderr,"输入的参数有误\n");
		return -1;
	}
	int port=atoi(argv[2]);
	//
	//从文件读取存储信息
	link_t* L=file_load();
	//
	//创建服务端socket文件
	int serverFD=socket(AF_INET, SOCK_STREAM, 0);
	printf("服务端套接字文件创建完成,serverFD=[%d]\n", serverFD);
	//
	//ip信息与socket文件绑定
	addr_in_t addr={0};
	addr.sin_family=AF_INET;
	addr.sin_port=htons(port);
	addr.sin_addr.s_addr=inet_addr(argv[1]);
	
	if(bind(serverFD, (addr_t*)&addr, sizeof(addr))==-1){
		perror("bind error");
		return -1;
	}
	//listen
	if(listen(serverFD, 10)==-1){
		perror("listen error");
		return -1;
	}
	while(1){
		//accept获取客户端socket文件
		addr_in_t client_addr={0};
		socklen_t client_len=sizeof(client_addr);
		int clientFD=accept(serverFD, (addr_t*)&client_addr, &client_len);
		//printf("客户端[%d][%s]已经建立连接\n", clientFD, inet_ntoa(client_addr.sin_addr.s_addr));
		//业务逻辑
		char buf[64];
		while(1){
			//ssize_t cnt=recv(clientFD,buf,sizeof(buf),0);
			//printf("cnt=[%ld],收到消息:%s\n", cnt,buf);
			//if(cnt==0){
			//	if(close(clientFD)==-1){
			//		perror("clientFD关闭失败");
			//		break;
			//	}
			//	printf("clientFD=[%d]已经关闭\n", clientFD);
			//	break;
			//}
			//读取报文
			msg_send_t msg;
			ssize_t cnt=recv(clientFD, &msg, sizeof(msg),0);
			printf("从客户端收到了[%ld]个字节\n", cnt);
			//业务处理
			msg_ret_t ret;
			handle(L,&msg, &ret);
			
			//返回处理结果
			cnt=send(clientFD, &ret, sizeof(ret),0);
			printf("ret=[%d],errmsg=[%s]\n", ret.ret, ret.errmsg);
			printf("向客户端发送了[%ld]个字节的数据\n", cnt);
		}

		//close客户端socket文件
	}

	return 0;
}
